import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

public class IsPossible {

    public boolean isPossible1(int[] nums) {
        HashMap<Integer, PriorityQueue<Integer>> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if (!map.containsKey(nums[i])) map.put(nums[i], new PriorityQueue<>());
            if (map.containsKey(nums[i] - 1)) {
                PriorityQueue<Integer> queue = map.get(nums[i] - 1);
                Integer poll = queue.poll();
                if (queue.isEmpty()) map.remove(nums[i] - 1);
                map.get(nums[i]).offer(poll + 1);
            } else {
                map.get(nums[i]).offer(1);
            }
        }
        for (Map.Entry<Integer, PriorityQueue<Integer>> entry : map.entrySet()) {
            if (entry.getValue().peek() < 3) return false;
        }
        return true;
    }

    public boolean isPossible(int[] nums) {
        if (nums.length < 3) return false;
        HashMap<Integer, Integer> map1 = new HashMap<>();
        HashMap<Integer, Integer> map2 = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map1.put(nums[i], map1.getOrDefault(nums[i], 0) + 1);
        }
        for (int num : nums) {
            if (map1.get(num) > 0) {
                int count = map2.getOrDefault(num - 1, 0);
                if (count > 0) {
                    map1.put(num, map1.get(num) - 1);
                    map2.put(num - 1, map2.get(num - 1) - 1);
                    map2.put(num, map2.getOrDefault(num, 0) + 1);
                } else {
                    int temp1 = map1.getOrDefault(num + 1, 0);
                    int temp2 = map1.getOrDefault(num + 2, 0);
                    if (temp1 > 0 && temp2 > 0) {
                        map2.put(num + 2, map2.getOrDefault(num + 2, 0) + 1);
                        map1.put(num, map1.get(num) - 1);
                        map1.put(num + 1, map1.get(num + 1) - 1);
                        map1.put(num + 2, map1.get(num + 2) - 1);
                    } else return false;
                }
            }
        }
        return true;
    }
}
